package cn.cy.structure.d02Dynamic.cglib;

import net.sf.cglib.core.DebuggingClassWriter;
import net.sf.cglib.proxy.Enhancer;

public class CglibDynamicProxyTest {

    public static void main(String[] args) throws InterruptedException {
        // 设置代理类class文件存入本地磁盘的路径，方便我们反编译查看源码
        String proxyClassPath = "E:\\workspace-idea\\codeyoung\\java_project\\code_151_design_pattern\\target\\classes\\cn\\codeyoung\\structurePattern\\d02Dynamic\\cglib";
        System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, proxyClassPath);
        
        // 创建增强器
        Enhancer enhancer = new Enhancer();
        // 为增强器指定要代理的业务类，即为生成的代理类指定父类
        enhancer.setSuperclass(TimeStatistic.class);
        // 设置回调
        enhancer.setCallback(new MyMethodInterceptor());
        
        // 创建CGLib动态代理对象
        TimeStatistic proxy = (TimeStatistic) enhancer.create();
        // 调用对象的方法
        proxy.execute();
        /**
         * 打印出类型看看
         *  原生CGLIB动态代理的类型：
         *      xxx.TimeStatistic$$EnhancerByCGLIB$$4c2b6908
         *  如果是Spring的CGLIB动态代理（比较一下区别）：
         *      xxx.TimeStatistic$$EnhancerBySpringCGLIB$$6e02ca33
         */
        System.out.println(proxy.getClass());
    }
    
}
